package com.huawei.classroom.student.h59;

import java.io.Closeable;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

public class ReactionTools {

	/**
	 * 根据reactionFile给出的一系列反应， 判断一个体系中根据init物质，判断出最后可能都存在什么物质o
	 * @param reactionFile 体系中初始反应物
	 * @param initComponents 体系中初始反应物
	 * @return 最后体系中存在的全部物质
	 */
	public Set<String> findAllComponents(String reactionFile,Set<String> initComponents){
		/*	以React类来存储每一个表达式，最后通过不断遍历来找符合反应式的物质
		 * 	本来想用键值对，但是感觉没有直接用两个set来得快，索性放弃
		 * 	此题最主要的就是记得使用String的split函数时，对于“.” “\” "|" "*" "+"来分割时前面得加上\\
		 */
		Set<React> all = new HashSet<>(); 
		try {
			String reaction = readFromTxt(reactionFile);
			String[] line = reaction.split("\r\n");
			for(int i=0; i<line.length; i++) {
				if(line[i].charAt(0) == '#')//跳过注释
					continue;
				//下面就是把反应两边化合物给提取然后生成一个React实例来保存
				String[] express = line[i].split("=");
				Set<String> r = new HashSet<>();
				Set<String> g = new HashSet<>();
				
				String[] temp = express[0].split(" \\+ ");
				for(int j=0; j<temp.length; j++) {
					r.add(temp[j].trim());
				}
								
				temp = express[1].split(" \\+ ");
				for(int j=0; j<temp.length; j++) {
					g.add(temp[j].trim());
				}
				
				all.add(new React(r, g));
			}
			//下面是一直遍历到没有新物质生成
			boolean check = true;
			while(check) {
				check = false;
				for(React i: all) {
					if(initComponents.containsAll(i.getReact()) && !initComponents.containsAll(i.getGain())) {
						initComponents.addAll(i.getGain());
						check = true;
					}
					else if(!initComponents.containsAll(i.getReact()) && initComponents.containsAll(i.getGain())) {
						initComponents.addAll(i.getReact());
						check = true;
					}
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(initComponents);
		return initComponents;
		
	}
	
	private String readFromTxt(String filename) throws Exception {
		Reader reader = null;
		try {
			StringBuffer buf = new StringBuffer();
			char[] chars = new char[1024];
			// InputStream in=new FileInputStream(filename);

			reader = new InputStreamReader(new FileInputStream(filename), "UTF-8");
			int readed = reader.read(chars);
			while (readed != -1) {
				buf.append(chars, 0, readed);
				readed = reader.read(chars);
			}
			return buf.toString();
		} finally {
			close(reader);
		}
	}
	
	private void close(Closeable inout) {
		if (inout != null) {
			try {
				inout.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

